#pragma once

#define PRIVATE_CASE_TYPE(enum_type, type, ...)                                \
  case enum_type: {                                                            \
    using scalar_t = type;                                                     \
    (__VA_ARGS__)();                                                           \
  }break;

#define DISPATCH_ALL_TYPES(type, ...)                                          \
  [&]() {                                                                      \
    switch (type) {                                                            \
      PRIVATE_CASE_TYPE(DataType::kFLOAT, float, __VA_ARGS__)                  \
      PRIVATE_CASE_TYPE(DataType::kHALF, half, __VA_ARGS__)                    \
      PRIVATE_CASE_TYPE(DataType::kINT8, int8_t, __VA_ARGS__)                  \
      PRIVATE_CASE_TYPE(DataType::kINT32, int32_t, __VA_ARGS__)                \
      PRIVATE_CASE_TYPE(DataType::kBOOL, bool, __VA_ARGS__)                    \
    default:                                                                   \
      break;                                                                   \
    }                                                                          \
  }()
